/*
 * @Author: your name
 * @Date: 2021-12-04 09:31:27
 * @LastEditTime: 2021-12-04 15:09:47
 * @LastEditors: Please set LastEditors
 * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 * @FilePath: \li-yuwei\serve\app\controller\pay.js
 */
"use strict";

const Controller = require("egg").Controller;
// 请求支付功能
const AlipaySDK = require("alipay-sdk").default;
// 将支付信息用 formdata 包裹住
const AlipayFormData = require("alipay-sdk/lib/form").default;
class Pay extends Controller {
    async zhifubao() {
        const { ctx, config, app } = this;
        const { odd, pay, title, id } = ctx.query;
        //调用 并 配置
        const alipaySdk = new AlipaySDK({
            appId: config.payConfig.appId, // 沙箱环境的appId
            privateKey: config.payConfig.privateKey, // 私钥
            signType: config.payConfig.signType, // 签名类型
            alipayPublicKey: config.payConfig.alipayPublicKey, // 支付宝公钥
            gateway: config.payConfig.gateway, // 网关地址
            timeout: config.payConfig.timeout, // 网关超时时间
            camelcase: config.payConfig.camelcase, // 是否把网关返回的下划线 key 转换为驼峰写法
        });
        //支付信息
        const formData = new AlipayFormData();
        formData.setMethod("get");
        formData.addField("appId", config.payConfig.appId);
        formData.addField("charset", "utf-8");
        formData.addField("signType", config.payConfig.signType);
        formData.addField(
            "notifyUrl",
            "http://localhost:8080/article/" + id + "?pay=true"
        );
        formData.addField(
            "returnUrl",
            "http://localhost:8080/article/" + id + "?pay=true"
        );

        formData.addField("bizContent", {
            outTradeNo: odd, // 【必选】商户订单号：64个字符内，包含数字，字母，下划线；需要保证在商户端不重复
            productCode: "FAST_INSTANT_TRADE_PAY", // 【必选】销售产品码，目前仅支持FAST_INSTANT_TRADE_PAY
            totalAmount: pay, // 【必选】订单总金额，精确到小数点后两位
            subject: `商品:《${title}》`, // 【必选】 订单标题
            body: `购买《${title}》文章`, // 【可选】订单描述
        });
        app.mysql.update("allarticle", { id, is_pay: 1 });
        /**
         * exec对应参数：
         * method（调用支付宝api）
         * params（api请求的参数（包含“公共请求参数”和“业务参数”））
         * options（validateSign，formData，log）
         */
        ctx.body = {
            code: 200,
            //发送支付获取返回页面
            url: await alipaySdk.exec("alipay.trade.page.pay", {}, { formData }),
        };
    }
}

module.exports = Pay;